/**
 * 存储用户信息：token、个人信息
 */
import { setToken, getToken, removeToken } from '@/utils/auth'
// 导入登录接口
import { loginApi, getUserInfoApi, getUserDetailByIdApi } from '@/api/user'
import { resetRouter } from '@/router'
export default {
  // 模块化加锁
  namespaced: true,
  // 1. 定义变量
  state: {
    // 先从本地cookie获取token，作为变量默认值
    token: getToken() || '',
    // 用户信息
    userInfo: {}
  },
  // 2. 修改变量(同步)
  mutations: {
    /**
     * 存储token
     * @param {*} state 所有变量
     * @param {*} token 调用setToken方法传入的参数值
     */
    setToken (state, token) {
      // 1. 内存存一份
      state.token = token
      // 2. 防止刷新没了，在硬盘存储一份
      setToken(token)
    },
    // 删除token=》退出登录
    delToken (state) {
      state.token = ''
      removeToken()
    },
    // 存储用户信息
    setUserInfo (state, info) {
      state.userInfo = info
    },
    // 删除用户信息
    delUserInfo (state) {
      state.userInfo = {}
    }

  },
  // 3. 调用后台接口发请求（异步）
  actions: {
    /**
     * 调用登录接口并存储token
     * @param {*} ctx 上下文
     * @param {*} loginForm 调用loginAction传入的参数值
     */
    async loginAction (ctx, loginForm) {
      // 1. 发请求获取token
      const token = await loginApi(loginForm)
      console.log('登录成功token:', token)
      // 2. 存储token？
      // ctx.commit === 等价于 this.$store.commit
      ctx.commit('setToken', token)
    },
    // 获取当前登录人信息
    async getUserInfoAction ({ commit }, loginForm) {
      // 1. 获取用户个人信息，但是没有头像
      const userInfo = await getUserInfoApi()
      console.log('获取用户个人信息：', userInfo)
      // 2. 获取用户头像信息
      // userInfo.userId 上一个接口返回的用户ID
      const avatorInfo = await getUserDetailByIdApi(userInfo.userId)
      console.log('用户头像信息', avatorInfo)
      // {...userInfo, ...avatorInfo}合并两个对象的数据并存到vuex
      commit('setUserInfo', { ...userInfo, ...avatorInfo })
      // 返回当前登录人的权限数据
      return userInfo.roles
    },
    // 退出登录
    logoutAction ({ commit }) {
      // 删除token和用户信息
      commit('delToken')
      commit('delUserInfo')
      // 1. 重置路由， 避免缓存
      resetRouter()
      // 2. 清除菜单数据，只留下静态路由
      // 说明❓：user模块调用menus模块中mutations方法，
      // 需要传入 {root:true}，才能跨模块调用
      commit('menus/setList', [], { root: true })
    }
  }
}
